import os
import logging

import pandas as pd
from pandas import Series
from pandas.core.interchange.dataframe_protocol import DataFrame
from Basic import Basic

import common.utils
# from tools import _get_files_name as get_files_name
from tools import BASE_PATH_企业级应用课设
from tools import *
from common import utils
from file import get_files_name
from file import check_filename_format, has_duplicates

logging.basicConfig(
    level=logging.DEBUG,
    format='%(levelname)8s: %(message)s'
)

文档 = '([^-\.]+)'
班级 = '([^-\.]+)'
学号 = '([0-9]{11})'
姓名 = '([^-\.]+)'
日期 = '([0-9]{4})'
后缀 = '([^-\.]+)'

BASE_PATH = r"D:\100-Project\2025-2026-1学期安排\首义学院\19201017_《企业级应用开发课程设计（企业）》"
FOLDER_PATH = f"{BASE_PATH}\学生提交\报告"
FILE_TYPES = ['.doc', '.docx', '.pdf']
PATTERN_报告 = f'^{文档}-{班级}-{学号}-{姓名}.{日期}.{后缀}$'


class 课设报告(Basic):

    # 类属性（所有实例共享）
    __BASE_SCORE = 28

    def __init__(self):
        super().__init__()

        self.name_sheet_file_path = f"{BASE_PATH}\学生提交\学生名单.xlsx"
        self.folder_path = f"{BASE_PATH}\学生提交\报告"
        self.output_file = f"{BASE_PATH}\学生提交\报告.xlsx"

        self.filenames: Series = pd.Series(dtype=str)
        self.ids = pd.Series(dtype=int)
        self.names = pd.Series(dtype=str)

        self.stu_list: DataFrame = pd.DataFrame(columns=['学号', '姓名'])
        self.commited_list: DataFrame = pd.DataFrame(columns=['学号', '姓名', '日期', '设计表现'])
        self.all_list: DataFrame = pd.DataFrame(columns=['学号', '姓名', '日期', '设计表现'])


    def get_stu_name_sheet_file_path(self):
        # 子类必须实现父类的抽象方法
        return self.name_sheet_file_path


    def get_commited_list(self) -> DataFrame:
        logging.debug("统计已提交的学生记录")

        if not self.commited_list.empty:
            return self.commited_list

        se_filenames = self.get_filenames_in_folder(FOLDER_PATH, FILE_TYPES)

        self.check_filenames_format(PATTERN_报告)
        self.check_filenames_duplicates(se_filenames)

        se_学号 = self.extract_parts_from_filename(se_filenames, PATTERN_报告, 3).astype(int)
        se_姓名 = self.extract_parts_from_filename(se_filenames, PATTERN_报告, 4).astype(str)
        se_日期 = self.extract_parts_from_filename(se_filenames, PATTERN_报告, 5).astype(str)

        # region 设计表现（满分30分）
        se_date = convert_mmdd_to_date(se_日期)

        min_date = se_date.min()                    # 1. 找到最早日期
        days_diff = (se_date - min_date).dt.days    # 2. 计算每个日期与最早日期的天数差
        se_成绩 = self.__BASE_SCORE - (days_diff + 1) // 2
        # endregion

        # region 设计报告（满分50分）

        #endregion

        df_merged = pd.DataFrame({
            '学号': se_学号,
            '姓名': se_姓名,
            '日期': se_日期,
            '设计表现': se_成绩
        })
        self.commited_list = df_merged

        return self.commited_list

    def get_all_list(self) -> DataFrame:
        logging.debug("统计所有学生记录")
        if not self.all_list.empty:
            return self.all_list

        df_stu_list = self.get_stu_list(self.name_sheet_file_path)
        df_commited_list = self.get_commited_list()
        df_commited_list = df_commited_list[['学号', '日期', '设计表现']]

        merged_df = pd.merge(
            df_stu_list,  # 左表
            df_commited_list,  # 右表
            on='学号',  # 关联列（必须在两表中都存在）
            how='left',  # 左连接方式
            suffixes=('_left', '_right')  # 解决同名列冲突（如 bbb 在两表都存在）
        )


        self.all_list = merged_df
        return self.all_list


if __name__ == "__main__":
    # df_学生_信息 = get_学生_信息()

    课设报告 = 课设报告()
    # se = 课设报告.get_filenames()
    # print(se)

    df = 课设报告.get_all_list()

    min = df['设计表现'].min()
    df['设计表现'] = df['设计表现'].fillna(min-1)
    # result = df[df['姓名']=='叶宇杰']
    # print(result)

    # df.to_excel(课设报告.output_file, index=False)
    # print(f"✅ 数据合并完成! 文件已保存至: {课设报告.output_file}")
